package org.geotiff.image;

import java.util.Properties;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.Iterator;
import java.io.InputStream;
import java.io.IOException;

/**
 * The <code>KeyMap</code> represents the two-way mapping
 * between a single set of GeoTIFF codes and their
 * symbolic string names. The <code>KeyRegistry</code>
 * keeps track of all of these.
 * @see KeyRegistry
 */
public class KeyMap extends Properties {

	private String name;

	private HashMap inverse=new HashMap();

	/** Empty Constructor for serialization */
	public KeyMap() { 
		super();
	}

	/** Constructor for named resource file */
	public KeyMap(String resourceName) 
		throws IOException
	{ 
		super();
		InputStream propfile = 
			getClass().getResourceAsStream(resourceName);
		if (propfile==null) {
			throw new IOException("Resource not found");
		}
		load(propfile);

		// Construct the inverse of the table
		Iterator iter = entrySet().iterator();
		while (iter.hasNext()) {
		  Map.Entry entry = (Map.Entry)iter.next();
		  try {
		     inverse.put(entry.getValue(), entry.getKey());
		  } catch (Exception e) {
		     // okay to fail for repeated.
		  } 
		}
	}

	/**
	 * Gets property from key; if value starts with a $
	 * it is an alias to another property. The method is
	 * non-recursive, and only follows one level of 
	 * indirection.
	 * @param key the symbolic key to resolve
	 */
	public String getProperty2(String key) {
		String val = getProperty(key);
		if (val==null) return val;
		if (val.startsWith("$")) {
		  val = getProperty(val.substring(1));
		}
		return val;
	}

	/**
	 * Gets integer code from named key
	 * @param key the symbolic key to resolve
	 */
	int getCode(String key) {
	   if (key==null) return -1;
	   String sval=getProperty2(key);
	   if (sval==null) return -1;
	   else return Integer.parseInt(sval.trim());
	}

	/**
	 * Gets primary string key from code value.
	 * @param code the numeric code to lookup.
	 */
	String getKey(int code) {
	   return (String)inverse.get((new Integer(code)).toString());
	}

}
